package com.example.num;

/**
 * 整数数组nums，在数组中找出由三个数字组成的最大乘积，并输出这个乘积
 * 乘积不会越界(Integer.MAX_VALUE)
 * 考察重点:线性扫描
 * 1.数组都是正数: 找到3个最大的数相乘
 * 2.数组都是负数: 找到3个最大的数相乘
 * 3.数组有正有负:
 *      找到两个最小的负数 * 最大的正数
 *      如果两个最小负数乘积小于第三个大正数和第二个大正数乘积，则采用1
 */
public class Max {

    private static int getMaxMin(int[] nums) {
        int min1 = Integer.MAX_VALUE, min2 = Integer.MAX_VALUE;
        int max1 = Integer.MIN_VALUE, max2 = Integer.MIN_VALUE, max3 = Integer.MIN_VALUE;
        for (int x : nums) {
            if (x < min1) {
                min2 = min1;// min2接过min1的值
                min1 = x;// min1获取到最小值
            } else if(x < min2) {
                min2 = x;
            }
            if (x > max1) {
                max3 = max2;
                max2 = max1;
                max1 = x;
            } else if(x > max2) {
                max3 = max2;
                max2 = x;
            } else if(x > max3) {
                max3 = x;
            }
        }
        return Math.max(min1 * min2 * max1, max1 * max2 * max3);
    }

    public static void main(String[] args) {

        System.out.println(getMaxMin(new int[] {-8, -2, -1, 1, 2, 5, 6}));

    }

}
